<?php

/**
 * Отображение оценок
 */
class grade_report_view {
	
	/**
	 * Тип отчета
	 * @var string
	 */
	private $type = NULL;
	
	/**
	 * Данные
	 * @var array()
	 */
	private $data = NULL;
	
	/**
	 * @param $type Тип отчета
	 * @param array $data Данные
	 */
	function __construct($type, $data) {
		$this->set_type($type);
		$this->add_data($data);
	}
	
	function __destruct() {
		
	}
	
	function set_type($type) {
		$this->type = $type;
	}
	
	public function add_data($data) {
		$this->data = $data;
	}
	
	/**
	 * Вычисляет год исходя из месяца для данного учебного года
	 */
	private function get_year($month) {
		if (9 <= $month && $month <= 12) {
			if (9 <= date("m", time()) && date("m", time()) <= 12) {
				return date("Y", time());
			} else if (1 <= date("m", time()) && date("m", time()) <= 8) {
				return (date("Y", time()) - 1);
			}
		} else if (1 <= $month && $month <= 8) {
			if (9 <= date("m", time()) && date("m", time()) <= 12) {
				return (date("Y", time()) + 1);
			} else if (1 <= date("m", time()) && date("m", time()) <= 8) {
				return date("Y", time());
			}
		}
	}
	
	private function get_header($class_name) {
		echo '<h2 align="left">';
		echo $class_name;
		echo '</h2>';
		if (is_numeric($this->data['service_information']['report_code'])) {
			echo "<p>Месячный балл " . $this->data['service_information']['report_code'] . "." . $this->get_year($this->data['service_information']['report_code']) . '</p>';
		} else if ($this->data['service_information']['report_code'] == "PI") {
			echo "<p>I семестр, предварительные оценки, 2012/13 г.</p>";
		} else if ($this->data['service_information']['report_code'] == "EI") {
			echo "<p>I семестр, экзаменационные оценки, 2012/13 г.</p>";
		} else if ($this->data['service_information']['report_code'] == "I") {
			echo "<p>I семестр, итоговые оценки, 2012/13 г.</p>";
		} else if ($this->data['service_information']['report_code'] == "AMI") {
			echo "<p>I семестр, месячные баллы, 2012/13 г.</p>";
		} else if ($this->data['service_information']['report_code'] == "FRI") {
			echo "<p>I семестр, итоговая ведомость, 2012/13 г.</p>";
		} else if ($this->data['service_information']['report_code'] == "PII") {
			echo "<p>II семестр, предварительные оценки, 2012/13 г.</p>";
		} else if ($this->data['service_information']['report_code'] == "EII") {
			echo "<p>II семестр, экзаменационные оценки, 2012/13 г.</p>";
		} else if ($this->data['service_information']['report_code'] == "II") {
			echo "<p>II семестр, итоговые оценки, 2012/13 г.</p>";
		} else if ($this->data['service_information']['report_code'] == "AMII") {
			echo "<p>II семестр, месячные баллы, 2012/13 г.</p>";
		} else if ($this->data['service_information']['report_code'] == "FRII") {
			echo "<p>II семестр, итоговая ведомость, 2012/13 г.</p>";
		} else if ($this->data['service_information']['report_code'] == "Y") {
			echo "<p>Годовая, итоговая ведомость, 2012/13 г.</p>";
		}
	}
	
	/**
	 * Отображение инициалов курсов в заголовке таблицы
	 * Если в группе курсов (в итоговой ведомости) нет ни одного курса для отображения,
	 * то отображается пустой столбик
	 * @param array $courses Курсы
	 * @param array $count_headers Количество заголовков в каждой группе курсов
	 * @param int $number_pupils_in_class Количество учеников в классе
	 */
	private function get_table_header($courses, $count_headers = NULL, $number_pupils_in_class = NULL) {
		if (empty($count_headers)) {
			foreach ($courses as $course) {
				echo "<th>$course</th>";
			}
		} else {
			$i_courses = 0;
			for ($i = 0; $i < count($count_headers); $i++) {
				if ($count_headers[$i] == 0) {
					echo "<th rowspan='" . ($number_pupils_in_class + 1) . "'></th>";
				} else {
					for ($i_count = 0; $i_count < $count_headers[$i]; $i_count++) {
						echo "<th>{$courses[$i_courses++]}</th>";
					}
				}
			}
		}
	}
	
	/**
	 * Вывод оценки
	 * @param object grade $grade Оценка
	 * @param int $current_position Текущий столбец
	 * @param array(int) $border Слева каких ячеек сделать более жирную границу
	 * @return void
	 */
	private function get_grade($grade, $current_position = 0, $border = NULL) {
		$grade_td = '<td';
		
		$grade_class_td = array(); // классы, применяемые к ячейке
		if ($grade->is_bad()) { 
			$grade_class_td[] = 'g2';
		}
		if (isset($border) && array_search($current_position, $border) !== false) {
			$grade_class_td[] = 'td-border-left';
		}
		$grade_td .= " class='" . implode(" ", $grade_class_td) . "'>";
		
		if ($this->type == 'total' and $this->data['service_information']['report_code'] == 'FRI') {
			$grade_td .= $grade->get_grade_text('total');
		} else {
			$grade_td .= $grade->get_grade_text();
		}
		$grade_td .= '</td>';
		echo $grade_td;
	}
	
	/**
	 * Вывод данных по ученику
	 * @param int $consecutive_number Номер по порядку
	 */
	private function get_user($pupil, $consecutive_number) {
		return <<<EOT
<td>
	<a href='http://edu.nsunc.com/edu/moodle/user/profile.php?id={$pupil['pupil']->get_id()}' target='_blank'>$consecutive_number</a>
</td>
<td class='name'>{$pupil['pupil']->get_lastname()} {$pupil['pupil']->get_name()}</td>
<td>{$pupil['pupil']->get_group()}</td>
EOT;
	}
	
	/**
	 * Просмотр месячного отчета
	 */
	private function view_simple() {
		foreach($this->data['data'] as $class_name => $class) {
			echo "<div class='grade-one-class'>";
			$this->get_header($class_name);
			
			echo <<<EOT
		<table>
			<tr>
				<th>№п/п</th>
				<th class="name">ФИО</th>
				<th>Гр</th>
EOT;
			
			$this->get_table_header($class['courses']);
			
			echo '</tr>';
			$i = 1; 
			foreach ($class['pupils'] as $pupil) {
				echo '<tr>';
				echo $this->get_user($pupil, $i++);
				foreach ($pupil["grades"] as $subject => $grade) {
					$this->get_grade($grade);
				}
				echo '</tr>';
			}
			echo '</table></div><p class="page-break"></p>';
		}
	}
	
	/**
	 * Возвращает табличный заголовок для итогового отчета
	 * @param array $count Информация о том, сколько столбцов объединять
	 * @return string
	 */
	private function get_total_table_header($count) {
		if ($this->data['service_information']['report_code'] == 'AMI') {
			return <<<EOT
<th colspan='{$count[0]}'>Сентябрь</th>
<th colspan='{$count[1]}'>Октябрь</th>
<th colspan='{$count[2]}'>Декабрь</th>
EOT;
		} else if ($this->data['service_information']['report_code'] == 'FRI') {
			return <<<EOT
<th colspan='{$count[0]}'>Предварительные оценки</th>
<th colspan='{$count[1]}'>Экзаменационные оценки</th>
<th colspan='{$count[2]}'>Итоговые оценки</th>
EOT;
		} else if ($this->data['service_information']['report_code'] == 'AMII') {
			return <<<EOT
<th colspan='{$count[0]}'>Февраль</th>
<th colspan='{$count[1]}'>Март</th>
<th colspan='{$count[2]}'>Апрель</th>
<th colspan='{$count[3]}'>Май</th>
EOT;
		} else if ($this->data['service_information']['report_code'] == 'FRII') {
			return <<<EOT
<th colspan='{$count[0]}'>Предварительные оценки</th>
<th colspan='{$count[1]}'>Экзаменационные оценки</th>
<th colspan='{$count[2]}'>Итоговые оценки</th>
EOT;
		} else if ($this->data['service_information']['report_code'] == 'FRY') {
			return <<<EOT
<th colspan='{$count[0]}'>Сентябрь</th>
<th colspan='{$count[1]}'>Октябрь</th>
<th colspan='{$count[2]}'>Декабрь</th>
<th colspan='{$count[3]}'>Предварительные оценки</th>
<th colspan='{$count[4]}'>Экзаменационные оценки</th>
<th colspan='{$count[5]}'>Итоговые оценки</th>
<th colspan='{$count[6]}'>Февраль</th>
<th colspan='{$count[7]}'>Март</th>
<th colspan='{$count[8]}'>Апрель</th>
<th colspan='{$count[9]}'>Май</th>
<th colspan='{$count[10]}'>Предварительные оценки</th>
<th colspan='{$count[11]}'>Экзаменационные оценки</th>
<th colspan='{$count[12]}'>Итоговые оценки</th>
EOT;
		}
	}
	
	private function view_total() {
		foreach($this->data['data'] as $class_name => $class) {
			echo "<div class='grade-one-class'>";
			$this->get_header($class_name);
			
			echo <<<EOT
		<table>
			<tr>
				<th rowspan='2'>№п/п</th>
				<th class="name" rowspan='2'>ФИО</th>
				<th rowspan='2'>Гр</th>
				{$this->get_total_table_header($class['count'])}
			</tr>
			<tr>
EOT;
			
			// Формирование массива с номерами ячеек, 
			// которые находятся на границе категории.
			// Более жирная граница будет слева ячейки
			$border = array();
			$border[0] = $class['count'][0];
			for ($i = 1; $i < count($class['count']); $i++) {
				$border[$i] = $border[$i-1] + $class['count'][$i];
			}
			
			$this->get_table_header($class['courses'], $class['count'], count($class['pupils']));
			
			echo '</tr>';
			$i = 1; 
			foreach ($class['pupils'] as $pupil) {
				echo '<tr>';
				echo $this->get_user($pupil, $i++);
				$j = 0; // текущий столбик
				foreach ($pupil["grades"] as $subject => $grade) {
					$this->get_grade($grade, $j++, $border);
				}
				echo '</tr>';
			}
			echo '</table></div><p class="page-break"></p>';
		}
	}
	
	function view() {
		if ($this->type == 'simple') {
			$this->view_simple();
		} else if ($this->type == 'total') {
			$this->view_total();
		}
	}
}

?>
